﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CES_Application.Models.Dados;
using Froggy;
using Froggy.Data;
using System.Data;

namespace CES_Application.Models.Negocio
{
    public class NegocioProduto
    {
        private readonly IRepositorioGenerico<Produto, CES_SistemaGerenciamentoEntities> repositorioProduto;
        private readonly IRepositorioGenerico<TipoProduto, CES_SistemaGerenciamentoEntities> repositorioTipoProduto;

        public NegocioProduto() 
        {
            repositorioProduto = new RepositorioGenerico<Produto,CES_SistemaGerenciamentoEntities>("chave");
            repositorioTipoProduto = new RepositorioGenerico<TipoProduto, CES_SistemaGerenciamentoEntities>("chave");
        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="produto"></param>
        /// <returns></returns>
        public bool Inserir(Produto produto)
        {
            repositorioProduto.Inserir(produto);
            return repositorioProduto.SaveChanges() > 0;
        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="produto"></param>
        /// <returns></returns>
        public bool Editar(Produto produto)
        {
            repositorioProduto.Update(produto);
            return repositorioProduto.SaveChanges() > 0;
        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="IdProduto"></param>
        /// <returns></returns>
        public Produto Obter(int IdProduto)
        {
            return repositorioProduto.ObterEntidade(produto => produto.idProduto == IdProduto);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="nome"></param>
        /// <returns></returns>
        public List<Produto> ObterPorNome(string nome)
        {
            return repositorioProduto.Obter(produto => produto.descricao.Contains(nome)).ToList();
        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="nome"></param>
        /// <returns></returns>
        public List<Produto> ObterProdutos(string desc, string codBarras, int idProduto)
        {
            if (idProduto != 0 && desc == "" && codBarras == "")
            {
                return repositorioProduto.Obter(produto => produto.idProduto == idProduto).ToList();
            }
            else
            {
                if (codBarras != "" && idProduto == 0 && desc == "")
                {
                    return repositorioProduto.Obter(produto => produto.codBarras.Equals(codBarras)).ToList();
                }
                else
                    return repositorioProduto.Obter(produto => produto.descricao.Contains(desc)).OrderBy( p => p.idProduto).ToList();

            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public List<Produto> ObterTodos()
        {
            try
            {
                return repositorioProduto.ObterTodos().ToList();
            }
            catch 
            {
                return null; 
            }
        }


        /// <summary>
        /// LISTA COM CLASSIFICAÇÃO DOS PRODUTO
        /// </summary>
        /// <returns></returns>
        public List<String> classificacaoProdutos()
        {

            List<String> classificacao = new List<string>();
            classificacao.Add("ADULTO");
            classificacao.Add("INFANTIL");
            classificacao.Add("INFANTOJUVENIL");
            return classificacao.ToList();
            
            
        }

        /// <summary>
        /// LISTA COM CLASSIFICAÇÃO DOS PRODUTO
        /// </summary>
        /// <returns></returns>
        public List<String> unidadeProdutos()
        {

            List<String> unidade = new List<string>();
            unidade.Add("UN");
            unidade.Add("ML");
            unidade.Add("CM");
            return unidade.ToList();


        }

        public List<TipoProduto> obterTodosTiposProd()
        {
            return repositorioTipoProduto.ObterTodos().ToList();
        }

        public int ObterUltimoID()
        {
            CES_SistemaGerenciamentoEntities db = new CES_SistemaGerenciamentoEntities();
            // return  Convert.ToInt32(db.Produto.OrderByDescending(p => p.idProduto).FirstOrDefault().ToString());
            if (ObterTodos() != null && ObterTodos().Count != 0)
            {
                var resultado = (from r in db.Produto
                                 orderby r.idProduto descending
                                 select r).First();

                return resultado.idProduto;
            }
            else
                return 0;
        }


        public Produto ObterProdutoAddVenda(string codBarras, int cod)
        {
            if (cod != 0)
            {
                return (Produto)repositorioProduto.ObterEntidade(produto => produto.idProduto == cod);
            }
            else 
            {
                return (Produto)repositorioProduto.ObterEntidade(produto => produto.codBarras.Equals(codBarras));
            }
        }


        public DataTable ObterTodossql()
        {

            #region SQL
            string sql = @"SELECT * FROM Produto p
                            INNER JOIN TipoProduto tp ON tp.idTipo = p.TipoProduto_idTipo
                            INNER JOIN Fornecedor f on f.idFornecedor = p.Fornecedor_idFornecedor";
            #endregion

            DbCommandUtil db = new DbCommandUtil(sql);
            return db.GetDataTable();
 
        }


        public void AtualizaEstoque(int quantidadeEstoque, int idProduto)
        {
            #region SQL
            string sql = @"UPDATE Produto
                            SET quantidadeEstoque = quantidadeEstoque-@quantidadeEstoque
                           WHERE idProduto = @idProduto";
            #endregion

            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@quantidadeEstoque", DbType.Int32, quantidadeEstoque);
            db.AddParameter("@idProduto", DbType.Int32, idProduto);
 
        }

    }
}
